package com.mdd.admin.service;

import com.mdd.admin.validate.commons.PageValidate;
import com.mdd.admin.validate.customer.CustomerMianCreateValidate;
import com.mdd.admin.validate.customer.CustomerMianMatchingSearchValidate;
import com.mdd.admin.validate.customer.CustomerMianUpdateValidate;
import com.mdd.admin.validate.customer.CustomerMianSearchValidate;
import com.mdd.admin.vo.customer.CustomerMianListedVo;
import com.mdd.admin.vo.customer.CustomerMianDetailVo;
import com.mdd.admin.vo.customer.CustomerMianMatchingVo;
import com.mdd.common.core.PageResult;
import com.mdd.common.entity.CustomerMian;

import java.util.List;

/**
 * 客户主表服务接口类
 * @author Jiejie
 */
public interface ICustomerMianService {

    /**
     * 客户主表列表
     *
     * @author Jiejie
     * @param pageValidate 分页参数
     * @param searchValidate 搜索参数
     * @return PageResult<CustomerMianListedVo>
     */
    PageResult<CustomerMianListedVo> list(PageValidate pageValidate, CustomerMianSearchValidate searchValidate);

    /**
     * 客户主表列表
     *
     * @author Jiejie
     * @param searchValidate 搜索参数
     * @return PageResult<CustomerMianListedVo>
     */
    List<CustomerMianListedVo> all(CustomerMianSearchValidate searchValidate);

    /**
     * 客户主表详情
     *
     * @author Jiejie
     * @param id 主键ID
     * @return CustomerMianDetailVo
     */
    CustomerMianDetailVo detail(Integer id);

    /**
     * 客户主表新增
     *
     * @author Jiejie
     * @param createValidate 参数
     */
    CustomerMian add(CustomerMianCreateValidate createValidate);

    /**
     * 客户主表编辑
     *
     * @author Jiejie
     * @param updateValidate 参数
     */
    void edit(CustomerMianUpdateValidate updateValidate);

    /**
     * 客户主表删除
     *
     * @author Jiejie
     * @param id 主键ID
     */
    void del(Integer id);

    /**
     * 评估客户与项目的匹配度并进行星级评定
     * <p>
     * 该方法实现以下功能：
     * 1. 获取客户匹配的项目及其匹配次数
     * 2. 获取客户详细信息
     * 3. 根据匹配次数评定项目星级
     * 4. 根据筛选条件过滤结果
     * 5. 更新客户与项目的匹配记录
     * </p>
     *
     * 匹配规则：
     * - 五星：匹配次数达到项目设定的五星标准
     * - 四星：匹配次数达到项目设定的四星标准但未达五星
     * - 三星：匹配次数达到项目设定的三星标准但未达四星
     * - 两星：仅匹配2次的特殊情况
     *
     * @param searchValidate 匹配搜索条件，包含客户ID和筛选参数
     * @return List<CustomerMianMatchingVo> 匹配结果列表，包含项目信息和匹配星级
     */
    List<CustomerMianMatchingVo> matching(CustomerMianMatchingSearchValidate searchValidate);

    /**
     * 业务员修改
     *
     * @author Jelvin
     * @param updateValidate 参数
     */
    void editSalesman(CustomerMianUpdateValidate updateValidate);
}